<?php
App::uses('AppController', 'Controller');
/**
 * Usuarios Controller
 *
 * @property Usuario $Usuario
 */
class UsuariosController extends AppController {
	
	
	var $components = array('EmailHandler'); 
	var $helpers = array('Geonames.GeonameInput');
	
	public function beforeFilter(){
		parent::beforeFilter();
		$this->Auth->allow('add', 'ativar', 'reenviar_email_ativacao', 'esqueci_a_senha');
	}

	public function index($tipo = null) {
		if($this->isAdmin() || $this->isRecepcionista()){
			$tipos = array('1' => 'Registrados', '2' => 'Não Registrados', '3' => 'Inscritos', '4' => 'Não inscritos');
			if(!is_null($tipo))
				switch($tipo){
					case 1:
						$conditions = array('Login.ativado' => '1');
						break;
					case 2:
						$conditions = array('Login.ativado' => '0');
						break;
					case 3:
						$conditions = array('Pagamento.id IS NOT NULL', 'Pagamento.confirmado' => '0');
						break;
					case 4:
						$conditions = array('Pagamento.id IS NULL', 'Login.ativado' => '1');
						break;
					case 5:
						$conditions = array('Pagamento.confirmado' => '1');
						break;
					default:
						$conditions = array();
				}
			else
				$conditions = array();
			$this->Usuario->recursive = 0;
			$this->set('usuarios', $this->paginate($conditions));
			$this->set(compact('tipos','tipo'));
			$this->set('editavel', $this->isAdmin());
		}
		else
			$this->redirect('/pages/blank');
	}

	public function view($id = null) {
		if(!$this->isAdmin()){
			$id = $this->usuarioSessao['Usuario']['id'];
		}
		if (!$this->Usuario->exists($id)) {
				throw new NotFoundException(__('Usuário não existe'));
		}
			$options = array('conditions' => array('Usuario.' . $this->Usuario->primaryKey => $id));
			$this->set('usuario', $this->Usuario->find('first', $options));
			if(!$this->isAdmin()){
				$this->render('userview');
			}
	}

	// URL: /registro
	public function add() {
		// TODO Pedir também os documentos e o telefone
		if($this->Datas->getDataSistemaLiberado() > date('Y-m-d H:i:s') || $this->Datas->getDataDesligarSistema() < date('Y-m-d H:i:s') ){
			$this->Session->setFlash(__('Fora do prazo de cadastro'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/');
		}
		if(!$this->Auth->loggedIn() || $this->isAdmin()){
			if ($this->request->is('post')) {
				$this->Usuario->create();
				if(!$this->isAdmin()){
					$this->request->data['Login']['tipo'] = USUARIO;
					$this->request->data['Login']['ativado'] = 0;
				}
				$this->request->data['Usuario']['hash'] = $this->Usuario->calculaHash($this->request->data);
				$dados = $this->request->data;
				if(!$this->isAdminGeral()){
					if($this->request->data['Login']['tipo'] == 0){
						$this->Session->setFlash(__('Ação inválida'), 'flash/bootstrap', array('class'=>'alert alert-error'));
						$this->notAuth();
					}
				}
				if ($this->Usuario->saveAll($dados)) {
					if(!$dados['Login']['ativado']){
						$destinatario = array($dados['Usuario']['email'] => $dados['Usuario']['nome']);
						$this->EmailHandler->registrar($destinatario, $dados['Usuario']['hash']);
						$this->Session->setFlash(__('Você foi registrado com sucesso! Verifique seu E-mail para validar seu registro!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					}
					else {
						$this->Session->setFlash(__('Você foi registrado com sucesso!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					}
					(($this->isAdmin()) ? $this->redirect(array('action' => 'index')) : $this->redirect('/login'));
					
					
				} else {
					$this->request->data['Login']['senha'] = '';
					$this->request->data['Login']['confirmacao_senha'] = '';
					$this->Session->setFlash(__('Registro falhou! Verifique os erros e tente novamente.'), 'flash/bootstrap', array('class'=>'alert alert-error'));
				}
			}
			$especializacaos = $this->Usuario->Especializacao->find('list');
			$associacaos = $this->Usuario->Associacao->find('list');
			$sexo = array('M' => 'Masculino', 'F' => 'Feminino');
			$this->set(compact('especializacaos', 'associacaos', 'sexo','documentos'));
			if($this->isAdmin()){
				$this->render('addmin');
			}
		}
		else
			$this->redirect('/pages/blank');
		
	}
	
	// TODO DONE Colocar endereço
	public function edit($id = null) {
		if($this->isAdmin()){
			if (!$this->Usuario->exists($id)) {
				throw new NotFoundException(__('Usuário inválido'));
			}
			$this->Usuario->unbindModel(array('belongsTo' => array('Especializacao', 'Associacao')));
			$options = array('conditions' => array('Usuario.' . $this->Usuario->primaryKey => $id), 'recursive' => 1);
			$data = $this->Usuario->find('first', $options);
			if ($this->request->is('post') || $this->request->is('put')) {
				$this->request->data['Login']['login'] = $data['Login']['login'];
				$this->request->data['Usuario']['hash'] = $this->Usuario->calculaHash($this->request->data);
				unset($this->request->data['Login']['senha']);
				unset($this->request->data['Login']['ativado']);
				if ($this->Usuario->saveall($this->request->data)) {
					$this->Session->setFlash(__('Usuário salvo com sucesso'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					$this->redirect(array('action' => 'index'));
				} else {
					$this->Session->setFlash(__('Usuário não pôde ser salvo'), 'flash/bootstrap', array('class'=>'alert alert-error'));
				}
			} else {
	
				$this->request->data = $data;
			}
			$especializacaos = $this->Usuario->Especializacao->find('list');
			$associacaos = $this->Usuario->Associacao->find('list');
			$sexo = array('M' => 'Masculino', 'F' => 'Feminino');
			$this->set(compact('especializacaos', 'associacaos', 'sexo', 'documentos'));
		}
		else
			$this->notAuth();
	}
	
	public function delete($id = null) {
		if($this->isAdmin()){
			$this->Usuario->id = $id;
			if (!$this->Usuario->exists()) {
				throw new NotFoundException(__('Invalid usuario'));
			}
			$this->request->onlyAllow('post', 'delete');
			if ($this->Usuario->delete()) {
				$this->Session->setFlash(__('Usuario excluído'), 'flash/bootstrap', array('class'=>'alert alert-success'));
				$this->redirect(array('action' => 'index'));
			}
			$this->Session->setFlash(__('Usuario não excluído'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect(array('action' => 'index'));
		}
		else
			$this->redirect('/pages/blank');
	}
	
	// URL: /ativar
	public function ativar($hash){
		if(!$this->Auth->loggedIn()){
			$usuario = $this->Usuario->find('first', array('conditions'=>array('Usuario.hash'=>$hash), 'recursive'=>0));
			if(!$usuario){
				$this->Session->setFlash(__('Registro falhou! Link inválido'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			}
			else if($usuario['Login']['ativado'])
				$this->Session->setFlash(__('Usuário já registrado!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
			else{
				$this->Usuario->Login->id = $usuario['Login']['id'];
				if($this->Usuario->Login->saveField('ativado', 1))
					$this->Session->setFlash(__('Registro efetuado com sucesso! Você pode se logar no sistema agora'), 'flash/bootstrap', array('class'=>'alert alert-success'));
				else $this->Session->setFlash(__('Registro falhou! Link inválido'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			}
		}
		$this->redirect('/');		
	}
	
	public function reenviar_email_ativacao(){
		if(!$this->Auth->loggedIn()){
			if ($this->request->is('post')) {
				$this->Usuario->recursive = 0;
				$usuario = $this->Usuario->findByEmail($this->request->data['Usuario']['email']);
				if($usuario){
					if(!$usuario['Login']['ativado']){
						$this->EmailHandler->registrar(array($usuario['Usuario']['email']=>$usuario['Usuario']['nome']), $usuario['Usuario']['hash']);
						$this->Session->setFlash(__('E-mail reenviado com sucesso!!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
						$this->redirect('/login');
					}
					else{
						$this->Session->setFlash(__('Esse usuário já foi ativado!'), 'flash/bootstrap', array('class'=>'alert alert-block'));
					}
				}
				else{
					$this->Session->setFlash(__('Esse E-mail não está cadastrado em nossa base!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
				}
			}
		}
		else
			$this->redirect('/');
	}
	
	public function esqueci_a_senha(){
		if(!$this->Auth->loggedIn()){
			if ($this->request->is('post')) {
				$this->Usuario->recursive = 0;
				$usuario = $this->Usuario->findByEmail($this->request->data['Usuario']['email']);
				if($usuario){
					$passwd = gerarSenha();
					$usuario['Login']['senha'] = $usuario['Login']['confirmacao_senha'] = $passwd;
					$this->Usuario->unbindModel(array('hasOne'=>array('Pagamento')));
					if ($this->Usuario->Login->save($usuario)) {
						$this->EmailHandler->passwdReset($usuario['Usuario']['email'], $usuario['Login']['login'], $passwd);
						$this->Session->setFlash(__('Você receberá em breve um email com a nova senha.'), 'flash/bootstrap', array('class'=>'alert alert-success'));
						$this->redirect('/login');
					}
					else 
						$this->Session->setFlash(__('Erro ao trocar a senha!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
					pr($this);
				}
				else{
					$this->Session->setFlash(__('Esse E-mail não está cadastrado em nossa base!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
				}
			}
		}
		else
			$this->redirect('/');
	}
	
	public function recepcionista(){
		if($this->isRecepcionista()){
			$conditions = array();
			if(!empty($this->request->data['nome']))
				$conditions['Usuario.nome LIKE'] = '%'.$this->request->data['nome'].'%';
			if(!empty($this->request->data['rg']))
				$conditions['Usuario.rg LIKE'] = '%'.$this->request->data['rg'].'%';
			if(!empty($this->request->data['cpf']))
				$conditions['Usuario.cpf LIKE'] = '%'.$this->request->data['cpf'].'%';
			if(!empty($conditions))
				$this->set('resultados', ($this->Usuario->find('all', array('conditions'=>$conditions))));
			else $this->set('resultados', false);
		}else{
			$this->notAuth();
		}
	}
	
	public function presente($id){
		if($this->isRecepcionista()){
			$this->Usuario->id = $id;
			if($this->Usuario->saveField('presente', 1))
				$this->Session->setFlash(__('Usuário marcado como presente!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
			else $this->Session->setFlash(__('Usuário não foi marcado como presente!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect('recepcionista');
		}else{
			$this->notAuth();
		}
	}
	
	public function lista_ordem_alfabetica($associacao = null){
		$this->loadModel('PagseguroFormasPagamento');
		$this->loadModel('Associacao');
		$this->Usuario->unbindModel(array(
				'hasOne'=>array('Login'),
				'belongsTo'=>array('Especializacao'),
				'hasMany'=>array('Trabalho', 'Telefone'),
				'hasAndBelongsToMany'=>array('Curso')
				));
		$this->paginate = array(
				'limit'=>20,
				'fields'=>array('DISTINCT(Usuario.id)', 'nome', 'Associacao.nome', 'Endereco.estado', 'StatusAtual.pagseguro_formas_pagamento_id', 'Pagamento.valor_total'),
				'order'=>'UPPER(Usuario.nome) ASC'
			);
		if(!is_null($associacao)){
			$this->paginate = array_merge(array('conditions'=>array('associacao_id'=>$associacao)), $this->paginate);
		}
		$dados = $this->paginate();
		$this->set('usuarios', $dados);
		$this->set('formas_pagamento', $this->PagseguroFormasPagamento->find('list'));
		$this->set('associacoes', $this->Associacao->find('list'));
		$this->set('associacao', $associacao);
	}
	
	public function resumo_estado(){
		$this->Usuario->unbindModel(array(
				'hasOne'=>array('Login'),
				'belongsTo'=>array('Especializacao'),
				'hasMany'=>array('Trabalho', 'Telefone'),
				'hasAndBelongsToMany'=>array('Curso')
		));
		$dados = $this->Usuario->find('all', array('fields'=>array('COUNT(Usuario.id) AS total', 'Endereco.estado'), 'group'=>'UPPER(Endereco.estado)'));
		$this->set('dados', $dados);
	}
}
